package filtri;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * Filtro per controllo della sessione ed eventuali errori con l'ora e la data
 * 
 * @author sestari
 */
public class filtroSession implements Filter {

    // The filter configuration object we are associated with.  If
    // this value is null, this filter instance is not currently
    // configured. 
    private FilterConfig filterConfig = null;

    public filtroSession() {
    }

    private void doBeforeProcessing(ServletRequest request, ServletResponse response)
            throws IOException, ServletException {
    }

    private void doAfterProcessing(ServletRequest request, ServletResponse response)
            throws IOException, ServletException {
    }

    /**
     *  Classe principale del filtro
     * @param request
     * @param response
     * @param chain
     * @throws IOException
     * @throws ServletException 
     */
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {



        try {
            if (request instanceof HttpServletRequest) {

                HttpServletRequest req = (HttpServletRequest) request;
                HttpSession session = req.getSession();


                //Se non c'e una sessione attiva
                //Se l'utente non e' nella pagina di registrazione
                if ((null == session.getAttribute("user")) && (req.getRequestURI().equalsIgnoreCase("/vaccinazioni/registrazione") == false) && (req.getRequestURI().equalsIgnoreCase("/vaccinazioni/registrarePaziente") == false)) {

                    String pagina = null;
                    if (request.getParameter("msg") == null) {
                        pagina = "/index.html?msg=Sessione scaduta!";
                    } else {
                        pagina = "/index.html";
                    }
                    filterConfig.getServletContext().getRequestDispatcher(pagina).forward(request, response);
                    return;


                } else {
                    //Se siamo qui, abbiamo una sessione attiva, allora:
                    //se cercho di andara alla pagina index, sono ridirezionato alla pagina di welcome
                    if ((req.getRequestURI().indexOf("index") != -1) || (req.getRequestURI().equalsIgnoreCase("/vaccinazioni/") == true)) {

                        filterConfig.getServletContext().getRequestDispatcher("/welcome").forward(request, response);
                        return;

                    } else {


                        //Se ho un paramentro chiamato data, verifico se la data è giusta
                        if (req.getParameterMap().containsKey("data")) {
                            String data = req.getParameter("data");
                            SimpleDateFormat forma = new SimpleDateFormat("dd'/'MM'/'yyyy");
                            java.sql.Date d = null;
                            try {
                                d = new java.sql.Date(forma.parse(data).getTime());
                            } catch (ParseException ex) {
                                filterConfig.getServletContext().getRequestDispatcher("/welcome?msge=Erro parametro Data").forward(request, response);
                                return;
                            }
                        }
                        //Se ho un paramentro chiamato ora, verifico se l'ora è giusta
                        if (req.getParameterMap().containsKey("ora")) {
                            String ora = req.getParameter("ora");
                            SimpleDateFormat forma = new SimpleDateFormat("HH':'mm':'ss");
                            java.sql.Time d = null;
                            try {
                                d = new java.sql.Time(forma.parse(ora).getTime());
                            } catch (ParseException ex) {
                                filterConfig.getServletContext().getRequestDispatcher("/welcome?msge=Erro parametro Ora").forward(request, response);
                                return;
                            }
                        }

                        //Se tutto è giusto, allora vado alla pagina che volevo
                        chain.doFilter(request, response);

                    }


                }

            }


        } catch (Throwable t) {
            // If an exception is thrown somewhere down the filter chain,
            // we still want to execute our after processing, and then
            // rethrow the problem after that.
            System.out.print(t);
        }

    }

    /**
     * Return the filter configuration object for this filter.
     */
    public FilterConfig getFilterConfig() {
        return (this.filterConfig);
    }

    /**
     * Set the filter configuration object for this filter.
     *
     * @param filterConfig The filter configuration object
     */
    public void setFilterConfig(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;
    }

    /**
     * Destroy method for this filter 
     */
    public void destroy() {
    }

    /**
     * Init method for this filter 
     */
    public void init(FilterConfig filterConfig) {
        this.filterConfig = filterConfig;

    }

    /**
     * Return a String representation of this object.
     */
    @Override
    public String toString() {
        if (filterConfig == null) {
            return ("filtroSession()");
        }
        StringBuffer sb = new StringBuffer("filtroSession(");
        sb.append(filterConfig);
        sb.append(")");
        return (sb.toString());
    }
}